﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using SistemaBastanteo.Persistencia;
using SistemaBastanteo.Dominio;

namespace SistemaBastanteo.Negocio
{
    public class BastanteoServiceImpl : IBastanteoService
    {
        IBastanteoDAO bastanteoDAO = null;

        IClienteDAO clienteDAO = null;
        ITipoEmpresaDAO tipoEmpresaDAO = null;
        IPoderDAO poderDAO = null;
        IRepresentanteDAO representanteDAO = null;
        ITipoDocumentoDAO tipoDocumentoDAO = null;

        public Dominio.Bastanteo RegistrarBastanteo(int cliente, string grupo, int poder, string intervencion, decimal importe, DateTime limite, ICollection<Dominio.Combinacion> combinacion)
        {
            //Exception si falta algun dato requerido
            if (cliente <=0 || grupo == null || poder <= 0 || intervencion == null || importe <= 0 || limite == null )
                throw new DatosInsuficientesException("Faltan Datos para Generar el Bastanteo");

            if (bastanteoDAO.ObtenerBastanteo(cliente, grupo, poder)!=null)
                throw new EntidadRepetidaException("Ya Existe un Bastanteo con el mismo Grupo, Poder y Cliente");

            if (intervencion=="En Conjunto Con" && combinacion==null)
                throw new DatosInsuficientesException("Segun el Tipo de Intervención Elegido, Faltan ingresar la Combinación");
            if (combinacion != null)
            {
                foreach (Combinacion combina in combinacion)
                    if(grupo == combina.GrupoConjunto)
                    throw new EntidadRepetidaException("El Grupo en Conjunto es el mismo Grupo Principal");

                int Contador = 0;
                foreach (Combinacion combina in combinacion)
                {
                    String grupoCombinaConjunto = combina.GrupoConjunto;
                    Contador++;
                    for (int num = Contador; num < combinacion.Count; num++)
                        if (combinacion.ElementAt(num).GrupoConjunto == grupoCombinaConjunto)
                            throw new EntidadRepetidaException("El Grupo a Combinar se ha Repetido");
                }
            }

                        

            Bastanteo bastanteoACrear = new Bastanteo();
            bastanteoACrear.Cliente = clienteDAO.Obtener(cliente);
            bastanteoACrear.Grupo =  grupo;
            bastanteoACrear.Poder = poderDAO.Obtener(poder);
            bastanteoACrear.TipoIntervencion = intervencion;
            bastanteoACrear.Importe = importe;
            bastanteoACrear.FechaLimite = limite;
            return bastanteoDAO.Generar(bastanteoACrear, combinacion);
            
        }

        public Bastanteo VerificarPoder(string ruc, int representante, int poder, decimal importe)
        {
            Bastanteo bastanteoAVerificar = null;
            
            bastanteoAVerificar = bastanteoDAO.VerificarPoderes(ruc, representante, poder);

            if (bastanteoAVerificar==null)
                throw new OperacionInvalidaException("No Tiene Poder para Realizar la Operación Indicada");
            
            if (bastanteoAVerificar.FechaLimite < DateTime.Now)
                throw new OperacionInvalidaException("El Poder que tenia ya ha vencido");

            if (bastanteoAVerificar.Importe < importe )
                throw new OperacionInvalidaException("El importe solicitado es Superior al Permitido");

            return bastanteoAVerificar;
            
        }

        public ICollection<Bastanteo> ConsultarPoderesPorGrupo(string ruc, int representante, string grupo)
        {
            ICollection<Bastanteo> listaAConsultar = null;

            listaAConsultar = bastanteoDAO.ConsultaPoderesGrupo(ruc, representante, grupo);

            if (listaAConsultar == null)
                throw new OperacionInvalidaException("No Existen Poderes para los criterios Ingresados");
            if (listaAConsultar.Count == 0)
                throw new OperacionInvalidaException("No Existen Poderes para los criterios Ingresados");



            return listaAConsultar;

        }

        public ICollection<Bastanteo> ConsultarPoderesPorTipo(string ruc, int representante, string tipoIntervencion)
        {
            ICollection<Bastanteo> listaAConsultar = null;

            listaAConsultar = bastanteoDAO.ConsultaPoderesTipo(ruc, representante, tipoIntervencion);

            if (listaAConsultar == null)
                throw new OperacionInvalidaException("No Existen Poderes para los criterios Ingresados");
            
            if (listaAConsultar.Count == 0)
                throw new OperacionInvalidaException("No Existen Poderes para los criterios Ingresados");

            return listaAConsultar;

        }

        public Array ListarGrupos(int cliente) {
            return bastanteoDAO.ListarGrupos(cliente);
        }

    }
}